/*
 * tcolaabbporo.h
 *
 *  Created on: 15/03/2010
 *      Author: javier
 */

#ifndef TCOLAABBPORO_H_
#define TCOLAABBPORO_H_


#include <iostream>
#include "tporo.h"
#include "tvectorporo.h"
#include "tabbporo.h"

/** \file tcolaabbporo.h
 *  \brief Implementación del tipo TColaABBPoro de TECAPS, mediante las clases TABBPoro y TECAP.
 *
 * Este fichero contiene la estructura de la clase TColaABBPoro de TECAPS.
 */


class TABBPoro;
class TECAP;

/** \brief Estructura de TColaABBPoro.
 *
 *  En esta clase encontramos las funciones para la colaabbporo, y su especificación.
 */
class TColaABBPoro
{
	friend class TABBPoro;
	friend class TECAP;
	/** \brief Sobrecarga del operador "<<", función amiga de TColaABBPoro.
	 *
	 * Función amiga que se encarga de mostrar por pantalla el recorrido de la cola.
	 *
	 * \param os Ostream donde guardaremos la informacion que queremos mostrar.
	 * \param cola Cola que mostraremos.
	 *
	 * \return La funcion devuelve un ostream&.
	 */
	friend ostream& operator<<(ostream &, const TColaABBPoro &);

	public:
		/** \brief Constructor de la clase.
		 *
		 * Constructor de la clase por defecto, donde creamos una cola vacia.
		 */
		TColaABBPoro();

		/** \brief Constructor de copia.
		 *
		 * Constructor de copia de la clase TColaABBPoro.
		 * \param cola Cola desde la que copiamos.
		 */
		TColaABBPoro(const TColaABBPoro &);

		 /** Destructor.
		 *
		 * Destructor de la clase TColaABBPoro.
		 */
		~TColaABBPoro();

		 /** \brief Sobrecarga del operador asignación.
		 *
		 * En esta sobrecarga asignamos el contenido del argumento al TColaABBPoro que llame al método.
		 * Si la Cola que llama a la función tenía contenido se borra y asignamos el parámetro.
		 *
		 * \param cola TColaABBPoro a partir del cual asignamos.
		 * \return TColaABBPoro& es devuelto con la correspondiente asignación efectuada.
		 */
		TColaABBPoro & operator=(const TColaABBPoro &);

		/** \brief Sobrecarga del operador igualdad.
		 *
		 * Comparamos que tengan los mismos TECAP en las mismas posiciones.
		 * \param cola Otro TColaABBPoro, con el que compararemos.
		 * \return Devuelve un bool, que indica si es igual o falso.
		 */
		bool operator==(const TColaABBPoro &);

        /** \brief Sobrecarga del operador suma.
         *
         * Devuelve la cola de la izquierda mas los TECAP de la derecha que no estan en la izquierda.
         *
         * \return  Devuelve la TColaABBPoro resultante.
         */
		TColaABBPoro operator+(const TColaABBPoro &);

        /** \brief Metodo EsVacio().
         *
         * Devuelve true si la cola esta vacio y false si no lo está.
         *
         * \return  Devuelve un bool para indicar su estado.
         */
		bool EsVacia();

        /** \brief Metodo EsVacio().
         *
         * Encola el TECAP p a la cola.
		 * \param p TECAP que meteremos en la cola.
         * \return  Devuelve true si se ha encolado.
         */
		bool Encolar(TABBPoro *);

        /** \brief Metodo EsVacio().
         *
         * Borra el primer TECAP de la cola.
		 *
         * \return  Devuelve true si se ha desencolado.
         */
		bool Desencolar();

        /** \brief Metodo EsVacio().
         *
         * Saca el primer elemento de la cola sin desencolarlo.
		 *
         * \return  Devuelve el poro.
         */
		TABBPoro * Cabeza();

        /** \brief Metodo EsVacio().
         *
         * Devuelve el numero de TECAP que hay en la cola.
		 *
         * \return  Devuelve el numero.
         */
		int Longitud();

	private:

		/** \brief Buscaritem.
		 *
		 * Esta funcion auxiliar de operador suma que se encarga de comprobar si esta el poro arb en la cola.
		 * \param arb TABBPoro.
		 * \return Bool true si esta el poro.
		 */
		bool Buscaritem( TABBPoro* &) const;

        /** \brief puntero a TECAP
         *
         * Puntero a un objeto TECAP, que conforman la estructura interna de la cola.
         */
		TECAP *primero;

        /** \brief puntero a TECAP
         *
         * Puntero a un objeto TECAP, que conforman la estructura interna de la cola.
         */
		TECAP *ultimo;
};

/** \brief Estructura de TECAP.
 *
 *  En esta clase encontramos los metodos de la clase TECAP.
 */
class TECAP
{
	friend class TNodoABB;
	friend class TABBPoro;
	friend class TColaABBPoro;

	public:
		/** \brief Constructor de la clase.
		 *
		 * Constructor de la clase por defecto.
		 */
		TECAP();
        /** \brief Constructor de copia.
         *
         * Constructor de copia.
         * \param t TECAP desde el que se copia.
         */
		TECAP(const TECAP &);

        /** \brief Destructor.
         *
         * Destructor de la clase.
         */
		~TECAP();

        /** \brief Sobrecarga del operador asignación.
         *
         * En esta sobrecarga asignamos el contenido del argumento al TECAP que llama al metodo.
         * \param t TECAP del que copiamos.
         * \return TECAP &.
         */
		TECAP & operator=(const TECAP &);

		friend ostream& operator<<(ostream &, const TColaABBPoro &);

	private:

        /** \brief puntero a TABBPoro
         *
         * Puntero a un objeto TABBPoro, que conforman la estructura interna del tecap.
         */
		TABBPoro *arbol;

        /** \brief puntero a TECAP
         *
         * Puntero a un objeto TECAP, que conforman la estructura interna del tecap.
         */
		TECAP *sig;
};



#endif /* TCOLAABBPORO_H_ */
